<?php
namespace App\Common\Cla\ClaBase\Traits\DataUnit;

use App\Common as com;

/**
 * Trait DataGetSet
 * @property array $_data 数据
 */
trait DataGetSet {

	/**
	 * 魔术方法->call
	 * @param string $name 方法名
	 * @param array $args 参数
	 * @return mixed 返回数据(可能抛出的异常:[get*]com\Cla\Err\Code::$sysDataErrorSeverity。[其他]com\Cla\Err\Code::$sysFunExecuteError)
	 * @throws
	 */
	public function __call( string $name, array $args ) {
		// 取动作类型
		$action = substr( $name, 0, 8 );
		// 处理属性读写
		return match ( $action ) {
			'getData_' => $this->__magicCallOfGetData( $name ),
			'setData_' => $this->__magicCallOfSetData( $name, $args ),
			default => throw com\Lib\Err\Exception::makeOfNew( '', com\Cla\Err\Code::$sysFunExecuteError ),
		};
	}

	/**
	 * call->getData
	 * @param string $name 方法名
	 * @return mixed 返回数据(如无法处理则抛出异常:com\Cla\Err\Code::$sysDataNotExist)
	 * @throws
	 */
	private function __magicCallOfGetData( string $name ):mixed {
		// 取出属性名
		$propertyName = substr( $name, 8 );
		$propertyName = com\Lib\Fun\Str::parseName( $propertyName, 1, false );
		// 检查可以读的属性
		if( ! array_key_exists( $propertyName, $this->_data ?? [] ) ){
			throw com\Lib\Err\Exception::makeOfNew( '', com\Cla\Err\Code::$sysDataNotExist );
		}
		// 读取属性值
		return $this->_data[ $propertyName ];
	}

	/**
	 * call->setData
	 * @param string $name 方法名
	 * @param array $args 参数
	 * @return mixed 返回数据(如无法处理则抛出异常:com\Cla\Err\Code::$sysDataNotExist)
	 * @throws
	 */
	private function __magicCallOfSetData( string $name, array $args ):mixed {
		// 取出属性名
		$propertyName = substr( $name, 8 );
		$propertyName = com\Lib\Fun\Str::parseName( $propertyName, 1, false );
		// 检查可以设置的属性
		if( ! array_key_exists( $propertyName, $this->_data ?? [] ) ){
			throw com\Lib\Err\Exception::makeOfNew( '', com\Cla\Err\Code::$sysDataNotExist );
		}
		// 设置属性值
		return $this->_data[ $propertyName ] = $args[0];
	}
}
